package com.example.leetcode.c1_c100.c77;
/**
 * 给定两个整数 n 和 k，返回 1 ... n 中所有可能的 k 个数的组合。
 *
 * 示例:
 *
 * 输入: n = 4, k = 2
 * 输出:
 * [
 *   [2,4],
 *   [3,4],
 *   [2,3],
 *   [1,2],
 *   [1,3],
 *   [1,4],
 * ]
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/combinations
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

import java.util.*;

/**
 * 组合
 * @author zhanpengguo
 * @date 2020-09-20 15:38
 */
public class Solution {


    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> res = new ArrayList<>();
        backtrack(res, new ArrayDeque<>(), n, k, 1);
        return res;
    }

    private void backtrack(List<List<Integer>> res, Deque<Integer> deque, int n, int k, int start) {
        if (deque.size() == k) {
            res.add(new ArrayList<>(deque));
            return;
        }
        for (int i = start; i <= n; i++) {
            deque.addLast(i);
            backtrack(res, deque, n, k, i + 1);
            deque.removeLast();
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        List<List<Integer>> combine = solution.combine(4, 2);
        combine.forEach(System.out::println);
    }
}
